package 字符流中第一个不重复的字符;

import java.util.LinkedList;
import java.util.Queue;

//题目描述
//请实现一个函数用来找出字符流中第一个只出现一次的字符。例如，当从字符流中只读出前两个字符"go"时，
// 第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时，第一个只出现一次的字符是"l"。
//输出描述:
//如果当前字符流没有存在出现一次的字符，返回#字符。
public class Solution
{
    int[] charCnt=new int[128];
    Queue<Character> queue= new LinkedList<Character>();
    //定义两个数据结构，一个int[]，记录各字符出现的次数，利用ascll码对应的索引，一个队列，记录出现字符的先后顺序。

    //Insert one char from stringstream
    public void Insert(char ch)
    {
        if (charCnt[ch]++==0)//单身字符，入队
            //char在int的位置，自动由ascll表转换过来
            //不管判断条件是否成立，都++
            queue.add(ch);
    }
    //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
        Character c1=null;
        char c;
        while ((c1=queue.peek())!=null)
        {
            c= c1;
            if (charCnt[c]==1)
                return c;
            else queue.remove();
        }
        return '#';
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.Insert('g');
        solution.Insert('o');
        solution.Insert('o');
        solution.Insert('g');
        solution.Insert('l');
        System.out.println(solution.FirstAppearingOnce());

    }
}
